package cn.iocoder.yudao.module.shop.info.dal.dataobject;

import cn.iocoder.yudao.framework.business.basic.enums.RecommendEnum;
import cn.iocoder.yudao.framework.business.basic.pojo.bo.TemplateParameter;
import cn.iocoder.yudao.framework.business.eligibility.pojo.po.EligibilityApplyEntity;
import cn.iocoder.yudao.framework.business.evaluation.enums.ScoreLevelEnum;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.region.RegionUtils;
import cn.iocoder.yudao.framework.region.vo.setter.AddressSaveSetter;
import cn.iocoder.yudao.framework.region.vo.setter.CountyAutoSetter;
import cn.iocoder.yudao.module.api.shop.info.enums.ShopOwnerTypeEnum;
import cn.iocoder.yudao.module.api.shop.info.enums.ShopStatusEnum;
import cn.iocoder.yudao.module.shop.category.pojo.po.ShopCategory;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;

/**
 * 店铺信息 TODO 后续在用户中心增加一个商家申请表，商家资料审核通过后才存入商户信息表+店铺信息表
 *
 * @author 山野羡民（1032694760@qq.com）
 */
@TableName(value = "shop_info", autoResultMap = true)
@KeySequence("shop_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@NoArgsConstructor
public class ShopInfoDO extends EligibilityApplyEntity implements AddressSaveSetter, CountyAutoSetter {
    /**
     * 主营类目编号
     *
     * @see ShopCategory#getId()
     */
    private Long categoryId;
    /**
     * 商家类型
     *
     * @see ShopOwnerTypeEnum
     */
    private Integer type;
    /**
     * 名称
     */
    private String name;
    /**
     * 徽标
     */
    private String logo;
    /**
     * 口号
     */
    private String slogan;
    /**
     * 门头照
     */
    private String banner;
    /**
     * 身份证号码。小微商户为个人身份证号码，个体户和企业为法人身份证号码
     */
    private String ownerEidNo;
    /**
     * 身份证正面图片地址
     */
    private String ownerEidFrontUrl;
    /**
     * 身份证反面图片地址
     */
    private String ownerEidBackUrl;
    /**
     * 营业执照号码。个体户和企业需要提供。
     */
    private String businessLicenseNo;
    /**
     * 营业执照图片地址。个体户和企业需要提供。
     */
    private String businessLicenseUrl;
    /**
     * 省份编码 TODO 后续冗余存储
     */
    @TableField(exist = false)
    private String provinceCode;
    /**
     * 省份名称
     */
    @TableField(exist = false)
    private String provinceName;
    /**
     * 城市编码 TODO 后续冗余存储
     */
    @TableField(exist = false)
    private String cityCode;
    /**
     * 城市名称
     */
    @TableField(exist = false)
    private String cityName;
    /**
     * 区县编码
     */
    private String countyCode;
    /**
     * 区县名称
     */
    @TableField(exist = false)
    private String countyName;
    /**
     * 详细地址
     */
    private String detailAddress;

    public String getDetailAddress() {
        if (detailAddress == null) {
            // NULL 时不能返回空串，防止修改时置空
            return null;
        }
        return RegionUtils.formatDetailAddress(getProvinceName(), getCityName(), getCountyName(), detailAddress);
    }

    /**
     * 完整地址
     */
    @TableField(exist = false)
    private String fullAddress;

    @SuppressWarnings("unused")
    public String getFullAddress() {
        return getProvinceName() + getCityName() + getCountyName() + getDetailAddress();
    }

    /**
     * 纬度
     */
    private Double latitude;
    /**
     * 经度
     */
    private Double longitude;
    /**
     * 距离，单位为米
     */
    @TableField(exist = false)
    private Double distance;
    /**
     * 是否平台自营
     */
    private Boolean selfOperated;
    /**
     * 推荐类型
     *
     * @see RecommendEnum
     */
    private Integer recommend;
    /**
     * 评分：1-5 分
     */
    private float score;

    public float getScore() {
        if (score <= 0f) {
            score = 5.0f;
        }
        return score;
    }

    /**
     * 评分星级
     *
     * @see ScoreLevelEnum
     */
    @TableField(exist = false)
    private Integer scoreLevel;

    @SuppressWarnings("unused")
    public Integer getScoreLevel() {
        return ScoreLevelEnum.fromScore(getScore()).getValue();
    }

    /**
     * 累计浏览量
     */
    private Integer browseCount;
    /**
     * 累计销量
     */
    private Integer salesCount;
    /**
     * 形象图集
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> picUrls;
    /**
     * 标签集
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> labels;
    /**
     * 简介
     */
    private String introduction;
    /**
     * 公告
     */
    private String notice;
    /**
     * 状态
     *
     * @see ShopStatusEnum
     */
    private Integer status;
    /**
     * 服务保障，JSON数组
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<TemplateParameter> serviceBenefits;
    /**
     * 服务保障，格式化给前端展示
     */
    @TableField(exist = false)
    private List<String> serviceBenefitsFormat;

    @SuppressWarnings("unused")
    public List<String> getServiceBenefitsFormat() {
        return TemplateParameter.formatValues(getServiceBenefits());
    }

    /**
     * 入驻套餐编号
     */
    private Long enterPackageId;
    /**
     * 入驻时间
     */
    private LocalDateTime enterTime;
    /**
     * 过期时间
     */
    private LocalDateTime expireTime;
    /**
     * 营业开始时间
     */
    private LocalTime openingTime;
    /**
     * 营业结束时间
     */
    private LocalTime closingTime;
    /**
     * 平台服务费百分比，范围为 0-100 之间的数字
     */
    private Double serviceFeePercent;
    /**
     * 顾客抵扣百分比，范围为 0-100 之间的数字
     */
    private Double discountPercent;
    /**
     * 下单范围半径，0 为不限制，单位：米
     */
    private Integer o2oRadius;
    /**
     * 开关
     *
     * @see CommonStatusEnum
     */
    private Integer enabled;

}
